﻿using System;
using System.Collections.Generic;
using System.Data.Linq;
using System.Linq;
using System.Text;
using EGym.BL.DataGestor;
using EGym.Data;

namespace EGym.BL.ControleSessao
{
    public class SessaoGestor : BaseGestor
    {
        #region Construtores

        public SessaoGestor(DBDataContext db)
        {
            DB = db;
        }
        #endregion

        #region Métodos
        public Sessao ProcuraSessao(string GUID)
        {
            var sessao = (from reg in DB.Sessaos
                         where reg.GUID.Equals(GUID) 
                         select reg).FirstOrDefault();
            return sessao;
        }
        
        public bool EstaFinalizada(Sessao sessao)
        {
            bool retorno = false;
            if (sessao != null)
                retorno = sessao.SessaoFim == null;
            return retorno ;
        }

        public int NextId()
        {
            var sessao = (from reg in DB.Sessaos
                          orderby reg.SessaoId descending
                          select reg).Take(1).FirstOrDefault();
            int retorno = sessao != null ? sessao.SessaoId + 1 : 1; 
            return retorno;
        }

        public Sessao RevisaTicketSessao(string GUID)
        {
            Sessao sessao = CriaNovaSessaoCasoNecessario(GUID);

            return sessao;
        }

        private Sessao CriaNovaSessaoCasoNecessario(string GUID)
        {
            Sessao sessao = ProcuraSessao(GUID); 
            //caso a sessão seja nula, cadastra no banco de dados a mesma.
            sessao = sessao ?? CriaNovaSessao();

            if (DateTime.Now > sessao.DataCadastro.AddMinutes(20))
            {
                Logoff(sessao);
                Salvar();
            }
            else
            {
                sessao.DataCadastro = DateTime.Now.AddMinutes(20); 
                DB.SubmitChanges(ConflictMode.FailOnFirstConflict);
            }
            
            if (sessao.SessaoFim != null)
                sessao = CriaNovaSessao();
            return sessao;
        }

        public Sessao CriaNovaSessao()
        {
            Sessao sessao = new Sessao();
            sessao.SessaoId = NextId();
            sessao.DataCadastro = DateTime.Now;
            sessao.GUID = Guid.NewGuid().ToString();
            DB.Sessaos.InsertOnSubmit(sessao);
            DB.SubmitChanges(ConflictMode.FailOnFirstConflict);
            return sessao;
        }

        public Sessao GetSessaoById(int sessaoId)
        {
            var sessao = (from reg in DB.Sessaos
                          where reg.SessaoId.Equals(sessaoId)
                          select reg).FirstOrDefault();
            return sessao;
        }

        public bool LogIn(Sessao sessao, string userName, string password)
        {
            var usuario = (from reg in DB.Usuarios
                           where reg.UserName.ToLower().Equals(userName.ToLower()) && reg.AfiliadoId > 1 && reg.Password.Equals(password)
                           select reg).FirstOrDefault();

            if (usuario == null)
                usuario = (from reg in DB.Usuarios
                           where reg.UserName.ToLower().Equals(userName.ToLower()) && reg.Password.Equals(password)
                           select reg).FirstOrDefault();

            if (usuario != null)
            {
                SessaoUsuario sessaoUsuario = new SessaoUsuario();

                sessaoUsuario.Sessao = sessao;
                sessaoUsuario.AfiliadoId = usuario.AfiliadoId;
                sessaoUsuario.Usuario  = usuario;

                DB.SessaoUsuarios.InsertOnSubmit(sessaoUsuario);

                DB.SubmitChanges(ConflictMode.FailOnFirstConflict);
            }

            return usuario != null;
        }

        public void Logoff(Sessao sessao)
        {
            Sessao sessaoEspelho = GetSessaoById(sessao.SessaoId);            
            if (sessaoEspelho!= null)
            {
                if (sessaoEspelho.SessaoFim == null)
                {
                    SessaoFim sessaoFim = new SessaoFim();

                    sessaoFim.DataCadastro = DateTime.Now;
                    sessaoFim.Sessao = sessaoEspelho;

                    DB.SessaoFims.InsertOnSubmit(sessaoFim);

                    DB.SubmitChanges(ConflictMode.FailOnFirstConflict);
                }
            }

        }

        public bool EstaAutenticado(string guid)
        {
            Sessao sessao = RevisaTicketSessao(guid);
            bool retorno = sessao.SessaoUsuarios.Count > 0;
            return retorno;
        }
        #endregion
    }
}
